<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- saved from url=(0065)http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html -->
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-cn"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script async="" src="./Java synchronized详解 - Devin Zhang - 博客园_files/analytics.js"></script>

<title>Java synchronized详解 - Devin Zhang - 博客园</title>
<link type="text/css" rel="stylesheet" href="./Java synchronized详解 - Devin Zhang - 博客园_files/blog-common.css">
<link id="MainCss" type="text/css" rel="stylesheet" href="./Java synchronized详解 - Devin Zhang - 博客园_files/bundle-sea.css">
<link title="RSS" type="application/rss+xml" rel="alternate" href="http://www.cnblogs.com/devinzhang/rss">
<link title="RSD" type="application/rsd+xml" rel="EditURI" href="http://www.cnblogs.com/devinzhang/rsd.xml">
<link type="application/wlwmanifest+xml" rel="wlwmanifest" href="http://www.cnblogs.com/devinzhang/wlwmanifest.xml">
<script async="" type="text/javascript" src="./Java synchronized详解 - Devin Zhang - 博客园_files/gpt.js"></script><script src="./Java synchronized详解 - Devin Zhang - 博客园_files/jquery.js" type="text/javascript"></script>  
<script type="text/javascript">var currentBlogApp = 'devinzhang', cb_enable_mathjax=false;</script>
<script src="./Java synchronized详解 - Devin Zhang - 博客园_files/blog-common.js" type="text/javascript"></script>
<script async="" type="text/javascript" src="./Java synchronized详解 - Devin Zhang - 博客园_files/pubads_impl_58.js"></script><script type="text/javascript" src="./Java synchronized详解 - Devin Zhang - 博客园_files/osd.js"></script></head>
<body>
<a name="top"></a>

<!--done-->
<div id="header">
	
<!--done-->
<div class="header">
	<div class="headerText">
		<a id="Header1_HeaderTitle" class="headermaintitle" href="http://www.cnblogs.com/devinzhang/">Devin Zhang</a><br>
		
	</div>
</div>

</div>

<div id="mytopmenu">
	
		<div id="mylinks">
<!--done-->
<a id="MyLinks1_HomeLink" class="menu" href="http://www.cnblogs.com/">博客园</a> &nbsp;
<a id="MyLinks1_MyHomeLink" class="menu" href="http://www.cnblogs.com/devinzhang/">首页</a> &nbsp;
<a href="http://q.cnblogs.com/" class="menu">博问</a> &nbsp;
<a href="http://home.cnblogs.com/ing/" class="menu">闪存</a> &nbsp;
<a id="MyLinks1_NewPostLink" class="menu" rel="nofollow" href="http://i.cnblogs.com/EditPosts.aspx?opt=1">新随笔</a> &nbsp;
<a id="MyLinks1_ContactLink" class="menu" rel="nofollow" href="http://space.cnblogs.com/msg/send/Devin+Zhang">联系</a> &nbsp;
<a id="MyLinks1_Syndication" class="menu" href="http://www.cnblogs.com/devinzhang/rss">订阅</a><a id="MyLinks1_XMLLink" href="http://www.cnblogs.com/devinzhang/rss"><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/xml.gif" alt="订阅"></a>&nbsp;
<a id="MyLinks1_Admin" class="menu" rel="nofollow" href="http://i.cnblogs.com/">管理</a>
</div>
		<div id="mystats">
<!--done-->
随笔-120&nbsp;
评论-194&nbsp;
文章-0&nbsp;
trackbacks-0
</div>
	
</div>
<div id="centercontent">
	

<div class="post">
	<h1 class="postTitle"><a id="cb_post_title_url" class="postTitle2" href="./Java synchronized详解 - Devin Zhang - 博客园_files/Java synchronized详解 - Devin Zhang - 博客园.html">Java synchronized详解</a></h1>
	<div id="cnblogs_post_body"><p><span style="font-size: 14pt;"><strong><span style="color: #0000ff;">第一篇：</span></strong></span></p>
<p><strong><span style="color: #0000ff;">使用synchronized</span><br></strong></p>
<p>在编写一个类时，如果该类中的代码可能运行于多线程环境下，那么就要考虑同步的问题。在Java中内置了语言级的同步原语－－synchronized，这也大大简化了Java中多线程同步的使用。我们首先编写一个非常简单的多线程的程序，是模拟银行中的多个线程同时对同一个储蓄账户进行存款、取款操作的。<br>在程序中我们使用了一个简化版本的Account类，代表了一个银行账户的信息。在主程序中我们首先生成了1000个线程，然后启动它们，每一个线程都对John的账户进行存100元，然后马上又取出100元。这样，对于John的账户来说，最终账户的余额应该是还是1000元才对。然而运行的结果却超出我们的想像，首先来看看我们的演示代码：<br><br></p>
<div>
<div><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><span>class&nbsp;Account&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span>float</span><span>&nbsp;amount;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Account(String&nbsp;name,&nbsp;</span><span>float</span><span>&nbsp;amount)&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>this</span><span>.name&nbsp;</span><span>=</span><span>&nbsp;name;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>this</span><span>.amount&nbsp;</span><span>=</span><span>&nbsp;amount;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;&nbsp;</span><span>void</span><span>&nbsp;deposit(</span><span>float</span><span>&nbsp;amt)&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>float</span><span>&nbsp;tmp&nbsp;</span><span>=</span><span>&nbsp;amount;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span>+=</span><span>&nbsp;amt;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>try</span><span>&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span>100</span><span>);</span><span>//</span><span>模拟其它处理所需要的时间，比如刷新数据库等</span><span><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span>catch</span><span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//</span><span>&nbsp;ignore</span><span><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount&nbsp;</span><span>=</span><span>&nbsp;tmp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;&nbsp;</span><span>void</span><span>&nbsp;withdraw(</span><span>float</span><span>&nbsp;amt)&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>float</span><span>&nbsp;tmp&nbsp;</span><span>=</span><span>&nbsp;amount;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span>-=</span><span>&nbsp;amt;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>try</span><span>&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span>100</span><span>);</span><span>//</span><span>模拟其它处理所需要的时间，比如刷新数据库等</span><span><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span>catch</span><span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//</span><span>&nbsp;ignore</span><span><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount&nbsp;</span><span>=</span><span>&nbsp;tmp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span>float</span><span>&nbsp;getBalance()&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>return</span><span>&nbsp;amount;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">public&nbsp;class&nbsp;AccountTest{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;</span><span>int</span><span>&nbsp;NUM_OF_THREAD&nbsp;</span><span>=</span><span>&nbsp;</span><span>1000</span><span>;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;Thread[]&nbsp;threads&nbsp;</span><span>=</span><span>&nbsp;</span><span>new</span><span>&nbsp;Thread[NUM_OF_THREAD];<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;</span><span>void</span><span>&nbsp;main(String[]&nbsp;args){<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;final&nbsp;Account&nbsp;acc&nbsp;</span><span>=</span><span>&nbsp;</span><span>new</span><span>&nbsp;Account(</span><span>"</span><span>John</span><span>"</span><span>,&nbsp;</span><span>1000</span><span>.0f);<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>for</span><span>&nbsp;(</span><span>int</span><span>&nbsp;i&nbsp;</span><span>=</span><span>&nbsp;</span><span>0</span><span>;&nbsp;i</span><span>&lt;</span><span>&nbsp;NUM_OF_THREAD;&nbsp;i</span><span>++</span><span>)&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threads[i]&nbsp;</span><span>=</span><span>&nbsp;</span><span>new</span><span>&nbsp;Thread(</span><span>new</span><span>&nbsp;Runnable()&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span>void</span><span>&nbsp;run()&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acc.deposit(</span><span>100</span><span>.0f);<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;acc.withdraw(</span><span>100</span><span>.0f);<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threads[i].start();<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>for</span><span>&nbsp;(</span><span>int</span><span>&nbsp;i</span><span>=</span><span>0</span><span>;&nbsp;i</span><span>&lt;</span><span>NUM_OF_THREAD;&nbsp;i</span><span>++</span><span>){<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>try</span><span>&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;threads[i].join();&nbsp;</span><span>//</span><span>等待所有线程运行结束</span><span><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span>catch</span><span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//</span><span>&nbsp;ignore</span><span><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span>"</span><span>Finally,&nbsp;John's&nbsp;balance&nbsp;is:</span><span>"</span><span>&nbsp;</span><span>+</span><span>&nbsp;acc.getBalance());<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"></span></div>
</div>
<p><br>注意，上面在Account的deposit和withdraw方法中之所以要把对amount的运算使用一个临时变量首先存储，sleep一段时间，然后，再赋值给amount，是为了模拟真实运行时的情况。因为在真实系统中，账户信息肯定是存储在持久媒介中，比如RDBMS中，此处的睡眠的时间相当于比较耗时的数据库操作，最后把临时变量tmp的值赋值给amount相当于把amount的改动写入数据库中。运行AccountTest，结果如下（每一次结果都会不同）：<br><br>E:\java\exer\bin&gt;java&nbsp;AccountTest<br>Finally,&nbsp;John's&nbsp;balance&nbsp;is:3900.0<br><br>E:\java\exer\bin&gt;java&nbsp;AccountTest<br>Finally,&nbsp;John's&nbsp;balance&nbsp;is:4900.0<br><br>E:\java\exer\bin&gt;java&nbsp;AccountTest<br>Finally,&nbsp;John's&nbsp;balance&nbsp;is:4700.0<br><br>E:\java\exer\bin&gt;java&nbsp;AccountTest<br>Finally,&nbsp;John's&nbsp;balance&nbsp;is:3900.0<br><br>E:\java\exer\bin&gt;java&nbsp;AccountTest<br>Finally,&nbsp;John's&nbsp;balance&nbsp;is:3900.0<br><br>E:\java\exer\bin&gt;java&nbsp;AccountTest<br>Finally,&nbsp;John's&nbsp;balance&nbsp;is:5200.0<br><br>为什么会出现这样的问题？这就是多线程中的同步的问题。在我们的程序中，Account中的amount会同时被多个线程所访问，这就是一个竞争资源，通常称作竞态条件。对于这样的多个线程共享的资源我们必须进行同步，以避免一个线程的改动被另一个线程所覆盖。在我们这个程序中，Account中的amount是一个竞态条件，所以所有对amount的修改访问都要进行同步，我们将deposit()和withdraw()方法进行同步，修改为：<br><br>&nbsp;&nbsp;</p>
<div>
<div><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><span>&nbsp;&nbsp;public&nbsp;synchronized&nbsp;</span><span>void</span><span>&nbsp;deposit(</span><span>float</span><span>&nbsp;amt)&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>float</span><span>&nbsp;tmp&nbsp;</span><span>=</span><span>&nbsp;amount;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span>+=</span><span>&nbsp;amt;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>try</span><span>&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span>1</span><span>);</span><span>//</span><span>模拟其它处理所需要的时间，比如刷新数据库等</span><span><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span>catch</span><span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//</span><span>&nbsp;ignore</span><span><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount&nbsp;</span><span>=</span><span>&nbsp;tmp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;synchronized&nbsp;</span><span>void</span><span>&nbsp;withdraw(</span><span>float</span><span>&nbsp;amt)&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>float</span><span>&nbsp;tmp&nbsp;</span><span>=</span><span>&nbsp;amount;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span>-=</span><span>&nbsp;amt;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>try</span><span>&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span>1</span><span>);</span><span>//</span><span>模拟其它处理所需要的时间，比如刷新数据库等</span><span><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span>catch</span><span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>//</span><span>&nbsp;ignore</span><span><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"></span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"><br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;amount&nbsp;</span><span>=</span><span>&nbsp;tmp;<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;}<br><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/None.gif" alt="" align="top"></span></div>
</div>
<p><br><br>此时，再运行，我们就能够得到正确的结果了。Account中的getBalance()也访问了amount，为什么不对getBalance()同步呢？因为getBalance()并不会修改amount的值，所以，同时多个线程对它访问不会造成数据的混乱。</p>
<p>&nbsp;</p>
<p><strong><span style="color: #0000ff;">同步加锁的是对象，而不是代码。</span></strong></p>
<p>因此，如果你的类中有一个同步方法，这个方法可以被两个不同的线程同时执行，只要每个线程自己创建一个的该类的实例即可。</p>
<p>&nbsp;</p>
<p>　　参考下面的代码：</p>
<p>class Foo extends Thread&nbsp;<br>{&nbsp;<br>　private int val;&nbsp;<br>　public Foo(int v)&nbsp;<br>　{&nbsp;<br>　　val = v;&nbsp;<br>　}&nbsp;<br>　public synchronized void printVal(int v)&nbsp;<br>　{&nbsp;<br>　　while(true)&nbsp;<br>　　　System.out.println(v);&nbsp;<br>　}&nbsp;<br>　public void run()&nbsp;<br>　{&nbsp;<br>　　printVal(val);&nbsp;<br>　}&nbsp;<br>}<br>class SyncTest&nbsp;<br>{&nbsp;<br>　public static void main(String args[])&nbsp;<br>　{&nbsp;<br>　　Foo f1 = new Foo(1);&nbsp;<br>　　f1.start();&nbsp;<br>　　Foo f2 = new Foo(3);<br>　　f2.start();&nbsp;<br>　}&nbsp;<br>}&nbsp;</p>
<p>　　运行SyncTest产生的输出是1和3交叉的。如果printVal是断面，你看到的输出只能是1或者只能是3而不能是两者同时出现。程序运行的结果证明两个线程都在并发的执行printVal方法，即使该方法是同步的并且由于是一个无限循环而没有终止。</p>
<p><span style="color: #0000ff;"><strong>类的同步：</strong></span></p>
<p>要实现真正的断面，你必须同步一个全局对象或者对类进行同步。下面的代码给出了一个这样的范例。</p>
<p>class Foo extends Thread&nbsp;<br>{&nbsp;<br>　private int val;&nbsp;<br>　public Foo(int v)&nbsp;<br>　{&nbsp;<br>　　val = v;&nbsp;<br>　}&nbsp;<br>　public void printVal(int v)&nbsp;<br>　{&nbsp;<br>　　synchronized(Foo.class) {&nbsp;<br>　　　while(true)<br>　　　　System.out.println(v);&nbsp;<br>　　}&nbsp;<br>　}&nbsp;<br>　public void run()&nbsp;<br>　{&nbsp;<br>　　printVal(val);&nbsp;<br>　}&nbsp;<br>}&nbsp;</p>
<p>　　上面的类不再对个别的类实例同步而是对类进行同步。对于类Foo而言，它只有唯一的类定义，两个线程在相同的锁上同步，因此只有一个线程可以执行printVal方法。</p>
<p>　　这个代码也可以通过对公共对象加锁。例如给Foo添加一个静态成员。两个方法都可以同步这个对象而达到线程安全。</p>
<p>面笔者给出一个参考实现，给出同步公共对象的两种通常方法：</p>
<p>　　1、</p>
<p>class Foo extends Thread&nbsp;<br>{&nbsp;<br>　private int val;<br>　private static Object lock=new Object();<br>　public Foo(int v)&nbsp;<br>　{&nbsp;<br>　　val = v;&nbsp;<br>　}&nbsp;<br>　public void printVal(int v)&nbsp;<br>　{&nbsp;<br>　　synchronized(lock) {&nbsp;<br>　　　while(true)<br>　　　　System.out.println(v);&nbsp;<br>　　}&nbsp;<br>　}&nbsp;<br>　public void run()&nbsp;<br>　{&nbsp;<br>　　printVal(val);&nbsp;<br>　}&nbsp;<br>}</p>
<p>　　上面的这个例子比原文给出的例子要好一些，因为原文中的加锁是针对类定义的，一个类只能有一个类定义，而同步的一般原理是应该尽量减小同步的粒度以到达更好的性能。笔者给出的范例的同步粒度比原文的要小。</p>
<p>　　2、</p>
<p>class Foo extends Thread&nbsp;<br>{<br>　private String name;<br>　private String val;<br>　public Foo(String name,String v)&nbsp;<br>　{&nbsp;<br>　　this.name=name;<br>　　val = v;&nbsp;<br>　}&nbsp;<br>　public void printVal()&nbsp;<br>　{&nbsp;<br>　　synchronized(val) {&nbsp;<br>　　　while(true) System.out.println(name+val);&nbsp;<br>　　}&nbsp;<br>　}&nbsp;<br>　public void run()&nbsp;<br>　{&nbsp;<br>　　printVal();&nbsp;<br>　}&nbsp;<br>}<br>public class SyncMethodTest&nbsp;<br>{&nbsp;<br>　public static void main(String args[])&nbsp;<br>　{&nbsp;<br>　　Foo f1 = new Foo("Foo 1:","printVal");&nbsp;<br>　　f1.start();&nbsp;<br>　　Foo f2 = new Foo("Foo 2:","printVal");<br>　　f2.start();&nbsp;<br>　}&nbsp;<br>}</p>
<p>　　上面这个代码需要进行一些额外的说明，因为JVM有一种优化机制，因为String类型的对象是不可变的，因此当你使用""的形式引用字符串时，如果JVM发现内存已经有一个这样的对象，那么它就使用那个对象而不再生成一个新的String对象，这样是为了减小内存的使用。</p>
<p>　　上面的main方法其实等同于：</p>
<p>public static void main(String args[])&nbsp;<br>{<br>　String value="printVal";<br>　Foo f1 = new Foo("Foo 1:",value);&nbsp;<br>　f1.start();&nbsp;<br>　Foo f2 = new Foo("Foo 2:",value);<br>　f2.start();&nbsp;<br>}&nbsp;</p>
<p><span style="color: #0000ff;"><strong><br></strong></span></p>
<p><strong><span style="color: #0000ff;">总结：</span></strong></p>
<p>1、synchronized关键字的作用域有二种： <br>1）是某个对象实例内，synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法（如果一个对象有多个synchronized方法，只要一个线程访问了其中的一个synchronized方法，其它线程不能同时访问这个对象中任何一个synchronized方法）。这时，不同的对象实例的synchronized方法是不相干扰的。也就是说，其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法； <br>2）是某个类的范围，synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。</p>
<p>2、除了方法前用synchronized关键字，synchronized关键字还可以用于方法中的某个区块中，表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/}，它的作用域是当前对象；</p>
<p>3、synchronized关键字是不能继承的，也就是说，基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){}，而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法；</p>
<p>Java语言的关键字，当它用来修饰一个方法或者一个代码块的时候，能够保证在同一时刻最多只有一个线程执行该段代码。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时，一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 二、然而，当一个线程访问object的一个synchronized(this)同步代码块时，另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 三、尤其关键的是，当一个线程访问object的一个synchronized(this)同步代码块时，其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 四、第三个例子同样适用其它同步代码块。也就是说，当一个线程访问object的一个synchronized(this)同步代码块时，它就获得了这个object的对象锁。结果，其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 五、以上规则对其它对象锁同样适用.</p>
<p>&nbsp;</p>
<p><strong><span style="font-size: 14pt; color: #0000ff;">第二篇：</span></strong></p>
<p>synchronized 关键字，它包括两种用法：synchronized 方法和 synchronized 块。&nbsp;&nbsp;<br>1. synchronized 方法：通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如：&nbsp;&nbsp;<br>public synchronized void accessVal(int newVal);&nbsp;&nbsp;<br>synchronized 方法控制对类成员变量的访问：每个类实例对应一把锁，每个 synchronized 方法都必须获得调用该方法的类实例的锁方能</p>
<p>执行，否则所属线程阻塞，方法一旦执行，就独占该锁，直到从该方法返回时才将锁释放，此后被阻塞的线程方能获得该锁，重新进入可执行</p>
<p>状态。这种机制确保了同一时刻对于每一个类实例，其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态（因为至多只有</p>
<p>一个能够获得该类实例对应的锁），从而有效避免了类成员变量的访问冲突（只要所有可能访问类成员变量的方法均被声明为 synchronized）</p>
<p>。&nbsp;&nbsp;<br>在 Java 中，不光是类实例，每一个类也对应一把锁，这样我们也可将类的静态成员函数声明为 synchronized ，以控制其对类的静态成</p>
<p>员变量的访问。&nbsp;&nbsp;<br>synchronized 方法的缺陷：若将一个大的方法声明为synchronized 将会大大影响效率，典型地，若将线程类的方法 run() 声明为</p>
<p>synchronized ，由于在线程的整个生命期内它一直在运行，因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可</p>
<p>以通过将访问类成员变量的代码放到专门的方法中，将其声明为 synchronized ，并在主方法中调用来解决这一问题，但是 Java 为我们提供</p>
<p>了更好的解决办法，那就是 synchronized 块。&nbsp;&nbsp;<br>2. synchronized 块：通过 synchronized关键字来声明synchronized 块。语法如下：&nbsp;&nbsp;<br>synchronized(syncObject) {&nbsp;&nbsp;<br>//允许访问控制的代码&nbsp;&nbsp;<br>}&nbsp;&nbsp;<br>synchronized 块是这样一个代码块，其中的代码必须获得对象 syncObject （如前所述，可以是类实例或类）的锁方能执行，具体机</p>
<p>制同前所述。由于可以针对任意代码块，且可任意指定上锁的对象，故灵活性较高。&nbsp;&nbsp;<br>对synchronized(this)的一些理解&nbsp;<br>一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时，一个时间内只能有一个线程得到执行。另一个线</p>
<p>程必须等待当前线程执行完这个代码块以后才能执行该代码块。&nbsp;&nbsp;<br>二、然而，当一个线程访问object的一个synchronized(this)同步代码块时，另一个线程仍然可以访问该object中的非synchronized</p>
<p>(this)同步代码块。&nbsp;&nbsp;<br>三、尤其关键的是，当一个线程访问object的一个synchronized(this)同步代码块时，其他线程对object中所有其它synchronized(this)</p>
<p>同步代码块的访问将被阻塞。&nbsp;&nbsp;<br>四、第三个例子同样适用其它同步代码块。也就是说，当一个线程访问object的一个synchronized(this)同步代码块时，它就获得了这个</p>
<p>object的对象锁。结果，其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。&nbsp;&nbsp;<br>五、以上规则对其它对象锁同样适用</p>
<p><br><span style="font-size: 14pt; color: #0000ff;"><strong>第三篇：</strong></span></p>
<p>打个比方：一个object就像一个大房子，大门永远打开。房子里有 很多房间（也就是方法）。</p>
<p>这些房间有上锁的（synchronized方法）， 和不上锁之分（普通方法）。房门口放着一把钥匙（key），这把钥匙可以打开所有上锁的房间。</p>
<p>另外我把所有想调用该对象方法的线程比喻成想进入这房子某个 房间的人。所有的东西就这么多了，下面我们看看这些东西之间如何作用的。</p>
<p>在此我们先来明确一下我们的前提条件。该对象至少有一个synchronized方法，否则这个key还有啥意义。当然也就不会有我们的这个主题了。</p>
<p>一个人想进入某间上了锁的房间，他来到房子门口，看见钥匙在那儿（说明暂时还没有其他人要使用上锁的 房间）。于是他走上去拿到了钥匙</p>
<p>，并且按照自己 的计划使用那些房间。注意一点，他每次使用完一次上锁的房间后会马上把钥匙还回去。即使他要连续使用两间上锁的房间，</p>
<p>中间他也要把钥匙还回去，再取回来。</p>
<p>因此，普通情况下钥匙的使用原则是：“随用随借，用完即还。”</p>
<p>这时其他人可以不受限制的使用那些不上锁的房间，一个人用一间可以，两个人用一间也可以，没限制。但是如果当某个人想要进入上锁的房</p>
<p>间，他就要跑到大门口去看看了。有钥匙当然拿了就走，没有的话，就只能等了。</p>
<p>要是很多人在等这把钥匙，等钥匙还回来以后，谁会优先得到钥匙？Not guaranteed。象前面例子里那个想连续使用两个上锁房间的家伙，他</p>
<p>中间还钥匙的时候如果还有其他人在等钥匙，那么没有任何保证这家伙能再次拿到。 （JAVA规范在很多地方都明确说明不保证，象</p>
<p>Thread.sleep()休息后多久会返回运行，相同优先权的线程那个首先被执行，当要访问对象的锁被 释放后处于等待池的多个线程哪个会优先得</p>
<p>到，等等。我想最终的决定权是在JVM，之所以不保证，就是因为JVM在做出上述决定的时候，绝不是简简单单根据 一个条件来做出判断，而是</p>
<p>根据很多条。而由于判断条件太多，如果说出来可能会影响JAVA的推广，也可能是因为知识产权保护的原因吧。SUN给了个不保证 就混过去了</p>
<p>。无可厚非。但我相信这些不确定，并非完全不确定。因为计算机这东西本身就是按指令运行的。即使看起来很随机的现象，其实都是有规律</p>
<p>可寻。学过 计算机的都知道，计算机里随机数的学名是伪随机数，是人运用一定的方法写出来的，看上去随机罢了。另外，或许是因为要想弄</p>
<p>的确定太费事，也没多大意义，所 以不确定就不确定了吧。）</p>
<p>再来看看同步代码块。和同步方法有小小的不同。</p>
<p>1.从尺寸上讲，同步代码块比同步方法小。你可以把同步代码块看成是没上锁房间里的一块用带锁的屏风隔开的空间。</p>
<p>2.同步代码块还可以人为的指定获得某个其它对象的key。就像是指定用哪一把钥匙才能开这个屏风的锁，你可以用本房的钥匙；你也可以指定</p>
<p>用另一个房子的钥匙才能开，这样的话，你要跑到另一栋房子那儿把那个钥匙拿来，并用那个房子的钥匙来打开这个房子的带锁的屏风。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 记住你获得的那另一栋房子的钥匙，并不影响其他人进入那栋房子没有锁的房间。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么要使用同步代码块呢？我想应该是这样的：首先对程序来讲同步的部分很影响运行效率，而一个方法通常是先创建一些局部变</p>
<p>量，再对这些变量做一些 操作，如运算，显示等等；而同步所覆盖的代码越多，对效率的影响就越严重。因此我们通常尽量缩小其影响范围。</p>
<p>如何做？同步代码块。我们只把一个方法中该同 步的地方同步，比如运算。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 另外，同步代码块可以指定钥匙这一特点有个额外的好处，是可以在一定时期内霸占某个对象的key。还记得前面说过普通情况下钥</p>
<p>匙的使用原则吗。现在不是普通情况了。你所取得的那把钥匙不是永远不还，而是在退出同步代码块时才还。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 还用前面那个想连续用两个上锁房间的家伙打比方。怎样才能在用完一间以后，继续使用另一间呢。用同步代码块吧。先创建另外</p>
<p>一个线程，做一个同步代码 块，把那个代码块的锁指向这个房子的钥匙。然后启动那个线程。只要你能在进入那个代码块时抓到这房子的钥匙</p>
<p>，你就可以一直保留到退出那个代码块。也就是说 你甚至可以对本房内所有上锁的房间遍历，甚至再sleep(10*60*1000)，而房门口却还有</p>
<p>1000个线程在等这把钥匙呢。很过瘾吧。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在此对sleep()方法和钥匙的关联性讲一下。一个线程在拿到key后，且没有完成同步的内容时，如果被强制sleep()了，那key还一</p>
<p>直在 它那儿。直到它再次运行，做完所有同步内容，才会归还key。记住，那家伙只是干活干累了，去休息一下，他并没干完他要干的事。为</p>
<p>了避免别人进入那个房间 把里面搞的一团糟，即使在睡觉的时候他也要把那唯一的钥匙戴在身上。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后，也许有人会问，为什么要一把钥匙通开，而不是一个钥匙一个门呢？我想这纯粹是因为复杂性问题。一个钥匙一个门当然更</p>
<p>安全，但是会牵扯好多问题。钥匙 的产生，保管，获得，归还等等。其复杂性有可能随同步方法的增加呈几何级数增加，严重影响效率。这也</p>
<p>算是一个权衡的问题吧。为了增加一点点安全性，导致效 率大大降低，是多么不可取啊。</p>
<p>synchronized的一个简单例子</p>
<p>public class TextThread {</p>
<p>public static void main(String[] args) {&nbsp;<br>&nbsp;&nbsp; TxtThread tt = new TxtThread();&nbsp;<br>&nbsp;&nbsp; new Thread(tt).start();&nbsp;<br>&nbsp;&nbsp; new Thread(tt).start();&nbsp;<br>&nbsp;&nbsp; new Thread(tt).start();&nbsp;<br>&nbsp;&nbsp; new Thread(tt).start();&nbsp;<br>}&nbsp;<br>}</p>
<p>class TxtThread implements Runnable {&nbsp;<br>int num = 100;&nbsp;<br>String str = new String();</p>
<p>public void run() {&nbsp;<br>&nbsp;&nbsp; synchronized (str) {&nbsp;<br>&nbsp;&nbsp;&nbsp; while (num &gt; 0) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; try {&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Thread.sleep(1);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.getMessage();&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(Thread.currentThread().getName()&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + "this is " + num--);&nbsp;<br>&nbsp;&nbsp;&nbsp; }&nbsp;<br>&nbsp;&nbsp; }&nbsp;<br>}&nbsp;<br>}</p>
<p>上面的例子中为了制造一个时间差,也就是出错的机会,使用了Thread.sleep(10)</p>
<p>Java对多线程的支持与同步机制深受大家的喜爱，似乎看起来使用了synchronized关键字就可以轻松地解决多线程共享数据同步问题。到底如</p>
<p>何？――还得对synchronized关键字的作用进行深入了解才可定论。</p>
<p>总的说来，synchronized关键字可以作为函数的修饰符，也可作为函数内的语句，也就是平时说的同步方法和同步语句块。如果再细的分类，</p>
<p>synchronized可作用于instance变量、object reference（对象引用）、static函数和class literals(类名称字面常量)身上。</p>
<p>在进一步阐述之前，我们需要明确几点：</p>
<p>A．无论synchronized关键字加在方法上还是对象上，它取得的锁都是对象，而不是把一段代码或函数当作锁――而且同步方法很可能还会被其</p>
<p>他线程的对象访问。</p>
<p>B．每个对象只有一个锁（lock）与之相关联。</p>
<p>C．实现同步是要很大的系统开销作为代价的，甚至可能造成死锁，所以尽量避免无谓的同步控制。</p>
<p>接着来讨论synchronized用到不同地方对代码产生的影响：</p>
<p>假设P1、P2是同一个类的不同对象，这个类中定义了以下几种情况的同步块或同步方法，P1、P2就都可以调用它们。</p>
<p>1． 把synchronized当作函数修饰符时，示例代码如下：</p>
<p>Public synchronized void methodAAA()</p>
<p>{</p>
<p>//….</p>
<p>}</p>
<p>这也就是同步方法，那这时synchronized锁定的是哪个对象呢？它锁定的是调用这个同步方法对象。也就是说，当一个对象P1在不同的线程中</p>
<p>执行这个同步方法时，它们之间会形成互斥，达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却可以任意调用这个被加了</p>
<p>synchronized关键字的方法。</p>
<p>上边的示例代码等同于如下代码：</p>
<p>public void methodAAA()</p>
<p>{</p>
<p>synchronized (this)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // (1)</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //…..</p>
<p>}</p>
<p>}</p>
<p>(1)处的this指的是什么呢？它指的就是调用这个方法的对象，如P1。可见同步方法实质是将synchronized作用于object reference。――那个</p>
<p>拿到了P1对象锁的线程，才可以调用P1的同步方法，而对P2而言，P1这个锁与它毫不相干，程序也可能在这种情形下摆脱同步机制的控制，造</p>
<p>成数据混乱：（</p>
<p>2．同步块，示例代码如下：</p>
<p>public void method3(SomeObject so)</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp; synchronized(so)</p>
<p>&nbsp;&nbsp;&nbsp; {&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //…..&nbsp;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>}</p>
<p>这时，锁就是so这个对象，谁拿到这个锁谁就可以运行它所控制的那段代码。当有一个明确的对象作为锁时，就可以这样写程序，但当没有明</p>
<p>确的对象作为锁，只是想让一段代码同步时，可以创建一个特殊的instance变量（它得是一个对象）来充当锁：</p>
<p>class Foo implements Runnable</p>
<p>{</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private byte[] lock = new byte[0]; // 特殊的instance变量</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Public void methodA()&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized(lock) { //… }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //…..</p>
<p>}</p>
<p>注：零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码：生成零长度的byte[]对象只需3条操作码，而Object lock</p>
<p>= new Object()则需要7行操作码。</p>
<p>3．将synchronized作用于static 函数，示例代码如下：</p>
<p>Class Foo&nbsp;<br>{</p>
<p>&nbsp;&nbsp;&nbsp; public synchronized static void methodAAA()&nbsp;&nbsp; // 同步的static 函数&nbsp;<br>&nbsp;&nbsp;&nbsp; {&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //….&nbsp;<br>&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public void methodBBB()&nbsp;<br>&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; synchronized(Foo.class)&nbsp;&nbsp; // class literal(类名称字面常量)</p>
<p>&nbsp;&nbsp;&nbsp; }&nbsp;<br>}</p>
<p>&nbsp;&nbsp; 代码中的methodBBB()方法是把class literal作为锁的情况，它和同步的static函数产生的效果是一样的，取得的锁很特别，是当前调用这</p>
<p>个方法的对象所属的类（Class，而不再是由这个Class产生的某个具体对象了）。</p>
<p>记得在《Effective Java》一书中看到过将 Foo.class和 P1.getClass()用于作同步锁还不一样，不能用P1.getClass()来达到锁这个Class的</p>
<p>目的。P1指的是由Foo类产生的对象。</p>
<p>可以推断：如果一个类中定义了一个synchronized的static函数A，也定义了一个synchronized 的instance函数B，那么这个类的同一对象Obj</p>
<p>在多线程中分别访问A和B两个方法时，不会构成同步，因为它们的锁都不一样。A方法的锁是Obj这个对象，而B的锁是Obj所属的那个Class。</p>
<p>小结如下：</p>
<p>搞清楚synchronized锁定的是哪个对象，就能帮助我们设计更安全的多线程程序。</p>
<p>还有一些技巧可以让我们对共享资源的同步访问更加安全：</p>
<p>1． 定义private 的instance变量+它的 get方法，而不要定义public/protected的instance变量。如果将变量定义为public，对象在外界可以</p>
<p>绕过同步方法的控制而直接取得它，并改动它。这也是JavaBean的标准实现方式之一。</p>
<p>2． 如果instance变量是一个对象，如数组或ArrayList什么的，那上述方法仍然不安全，因为当外界对象通过get方法拿到这个instance对象</p>
<p>的引用后，又将其指向另一个对象，那么这个private变量也就变了，岂不是很危险。 这个时候就需要将get方法也加上synchronized同步，并</p>
<p>且，只返回这个private对象的clone()――这样，调用端得到的就是对象副本的引用了</p></div><div id="MySignature"></div>
<div class="clear"></div>
<div id="blog_post_info_block">
<div id="BlogPostCategory"></div>
<div id="EntryTag"></div>
<div id="blog_post_info"><div id="green_channel">
绿色通道：
<a href="javascript:void(0);" id="green_channel_digg" onclick="DiggIt(2287675,cb_blogId,1);green_channel_success(this,&#39;谢谢推荐！&#39;);">好文要顶</a>
<a id="green_channel_follow" onclick="c_follow();" href="javascript:void(0);">关注我</a>
<a id="green_channel_favorite" onclick="AddToWz(cb_entryId);return false;" href="javascript:void(0);">收藏该文</a><a id="green_channel_contact" href="http://space.cnblogs.com/msg/send/Devin+Zhang" target="_blank">与我联系</a>
<a id="green_channel_weibo" href="javascript:void(0);" title="分享至新浪微博" onclick="ShareToTsina()"><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/icon_weibo_24.png" alt=""></a>
</div>
<div id="author_profile">
<div id="author_profile_info" class="author_profile_info">
<a href="http://home.cnblogs.com/u/devinzhang/" target="_blank"><img src="./Java synchronized详解 - Devin Zhang - 博客园_files/sample_face.gif" class="author_avatar" alt=""></a>
<div id="author_profile_detail" class="author_profile_info">
<a href="http://home.cnblogs.com/u/devinzhang/">Devin Zhang</a><br>
<a href="http://home.cnblogs.com/u/devinzhang/followees">关注 - 0</a><br>
<a href="http://home.cnblogs.com/u/devinzhang/followers">粉丝 - 652</a>
</div>
</div>
<div class="clear"></div>
<div id="author_profile_honor"></div>
<div id="author_profile_follow">
    <a href="javascript:void(0);" onclick="c_follow();return false;">+加关注</a>
</div>
</div>
<div id="div_digg">										
    <div class="diggit" onclick="votePost(2287675,&#39;Digg&#39;)">
        <span class="diggnum" id="digg_count">25</span>
    </div>
	<div class="buryit" onclick="votePost(2287675,&#39;Bury&#39;)"> 
		<span class="burynum" id="bury_count">0</span>
	</div>
	<div class="clear"></div>	
	<div class="diggword" id="digg_tips">
    (请您对文章做出评价)
    </div>	
</div>
</div>
<div class="clear"></div>
<div id="post_next_prev"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/13/2286367.html" class="p_n_p_prefix">« </a> 上一篇：<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/13/2286367.html" title="发布于2011-12-13 17:28">Java关键字static</a><br><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/17/2291396.html" class="p_n_p_prefix">» </a> 下一篇：<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/17/2291396.html" title="发布于2011-12-17 21:57">Android的ADB工具使用</a><br></div>
</div>


	<div class="postDesc">posted on <span id="post-date">2011-12-14 15:45</span> <a href="http://www.cnblogs.com/devinzhang/">Devin Zhang</a> 阅读(<span id="post_view_count">102464</span>) 评论(<span id="post_comment_count">21</span>)  <a href="http://i.cnblogs.com/EditPosts.aspx?postid=2287675" rel="nofollow">编辑</a> <a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#" onclick="AddToWz(2287675);return false;">收藏</a></div>
</div>
<script type="text/javascript">var allowComments=true,isLogined=false,cb_blogId=104312,cb_entryId=2287675,cb_blogApp=currentBlogApp,cb_blogUserGuid='65ff1fe1-c126-e011-ac81-842b2b196315',cb_entryCreatedDate='2011/12/14 15:45:00';loadViewCount(cb_entryId);</script>

<a name="!comments"></a><div id="blog-comments-placeholder"><div id="comments_pager_top"></div>
<!--done-->
<br>
<b>评论:</b>
<div class="feedbackNoItems"></div>
	

		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2478518" class="layer">#1楼</a><a name="2478518" id="comment_anchor_2478518"></a>
				 <span class="comment_date">2012-09-21 17:54</span> | <a id="a_comment_author_2478518" href="http://home.cnblogs.com/u/353641/" target="_blank">esd2846</a> <a href="http://msg.cnblogs.com/msg/send/esd2846" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2478518" class="blog_comment_body">写得很通俗，赞一个</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2478518,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2478518,&#39;Bury&#39;,this)">反对(0)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2487331" class="layer">#2楼</a><a name="2487331" id="comment_anchor_2487331"></a>
				 <span class="comment_date">2012-10-05 20:29</span> | <a id="a_comment_author_2487331" href="http://www.cnblogs.com/itfky/" target="_blank">少司命</a> <a href="http://msg.cnblogs.com/msg/send/%e5%b0%91%e5%8f%b8%e5%91%bd" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2487331" class="blog_comment_body">实测表明，在以下方法中，将sleep的时间改为随机值效果会比较明显：public void deposit(float amt)<br>	{<br>		float tmp = amount;<br>		tmp += amt;<br>		try<br>		{<br>			Thread.sleep((int)(Math.random()*1000));			<br>		}<br>		catch(InterruptedException e)<br>		{<br>			e.printStackTrace();<br>		}<br>		amount = tmp;<br>	}</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2487331,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2487331,&#39;Bury&#39;,this)">反对(0)</a></div><span id="comment_2487331_avatar" style="display:none;">http://pic.cnitblog.com/face/u351923.jpg?id=16213152</span>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2555034" class="layer">#3楼</a><a name="2555034" id="comment_anchor_2555034"></a>
				 <span class="comment_date">2012-11-18 15:14</span> | <a id="a_comment_author_2555034" href="http://home.cnblogs.com/u/91888/" target="_blank">six</a> <a href="http://msg.cnblogs.com/msg/send/six" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2555034" class="blog_comment_body">其实一个c#人来说下吧<br><br>90%的都线程，都是为了同步一个对象，减少更新对象所用的时间<br><br>也就是说90%的线程都必须同步的<br><br>而C#同步，java同步<br><br>c#人是完全必须要同步的，不同步我都真的不知道怎么写。<br><br>java那是庸人自扰。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2555034,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2555034,&#39;Bury&#39;,this)">反对(1)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2627851" class="layer">#4楼</a><a name="2627851" id="comment_anchor_2627851"></a>
				 <span class="comment_date">2013-03-05 11:39</span> | <a id="a_comment_author_2627851" href="http://home.cnblogs.com/u/92972/" target="_blank">imnath!</a> <a href="http://msg.cnblogs.com/msg/send/imnath!" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2627851" class="blog_comment_body">大赞啊 太仔细了！！！</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2627851,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2627851,&#39;Bury&#39;,this)">反对(0)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2637307" class="layer">#5楼</a><a name="2637307" id="comment_anchor_2637307"></a>
				 <span class="comment_date">2013-03-18 19:32</span> | <a id="a_comment_author_2637307" href="http://home.cnblogs.com/u/506219/" target="_blank">bestwzy</a> <a href="http://msg.cnblogs.com/msg/send/bestwzy" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2637307" class="blog_comment_body">非常感谢</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2637307,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2637307,&#39;Bury&#39;,this)">反对(0)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2650587" class="layer">#6楼</a><a name="2650587" id="comment_anchor_2650587"></a>
				 <span class="comment_date">2013-04-06 13:11</span> | <a id="a_comment_author_2650587" href="http://home.cnblogs.com/u/445616/" target="_blank">菠菜变菠萝</a> <a href="http://msg.cnblogs.com/msg/send/%e8%8f%a0%e8%8f%9c%e5%8f%98%e8%8f%a0%e8%90%9d" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2650587" class="blog_comment_body">有点啰嗦。。拼凑感</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2650587,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2650587,&#39;Bury&#39;,this)">反对(0)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2658772" class="layer">#7楼</a><a name="2658772" id="comment_anchor_2658772"></a>
				 <span class="comment_date">2013-04-16 14:09</span> | <a id="a_comment_author_2658772" href="http://home.cnblogs.com/u/517722/" target="_blank">Rosepotato</a> <a href="http://msg.cnblogs.com/msg/send/Rosepotato" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2658772" class="blog_comment_body">楼主说到：可以推断：如果一个类中定义了一个synchronized的static函数A，也定义了一个synchronized 的instance函数B，那么这个类的同一对象Obj<br><br>在多线程中分别访问A和B两个方法时，不会构成同步，因为它们的锁都不一样。<b>A方法的锁是Obj这个对象，而B的锁是Obj所属的那个Class。</b><br>我说： 粗体的地方 楼主是不是写反了。 A方法的锁是Obj所属的那个Class,B方法的锁是Obj这个对象。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2658772,&#39;Digg&#39;,this)">支持(3)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2658772,&#39;Bury&#39;,this)">反对(0)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2720606" class="layer">#8楼</a><a name="2720606" id="comment_anchor_2720606"></a>
				 <span class="comment_date">2013-07-05 10:02</span> | <a id="a_comment_author_2720606" href="http://www.cnblogs.com/highfly2012/" target="_blank">highfly2012</a> <a href="http://msg.cnblogs.com/msg/send/highfly2012" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2720606" class="blog_comment_body"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2658772" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,2658772);">@</a>Rosepotato<br>我也感觉好像是说反了，求证</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2720606,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2720606,&#39;Bury&#39;,this)">反对(0)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2733573" class="layer">#9楼</a><a name="2733573" id="comment_anchor_2733573"></a>
				 <span class="comment_date">2013-07-23 16:59</span> | <a id="a_comment_author_2733573" href="http://www.cnblogs.com/xiaoSoldier/" target="_blank">xiaoSoldier</a> <a href="http://msg.cnblogs.com/msg/send/xiaoSoldier" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2733573" class="blog_comment_body"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2720606" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,2720606);">@</a>highfly2012<br>我觉得也是。  应该是反了</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2733573,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2733573,&#39;Bury&#39;,this)">反对(0)</a></div><span id="comment_2733573_avatar" style="display:none;">http://pic.cnitblog.com/face/u161338.jpg</span>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2752237" class="layer">#10楼</a><a name="2752237" id="comment_anchor_2752237"></a>
				 <span class="comment_date">2013-08-15 18:00</span> | <a id="a_comment_author_2752237" href="http://www.cnblogs.com/holdoner/" target="_blank">holdoner</a> <a href="http://msg.cnblogs.com/msg/send/holdoner" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2752237" class="blog_comment_body">你好，我测试了你的第一个例子，但是结果却跟你说的不一样。程序的运行结果始终是：<br>Finally, John's balance is:1000.0<br><br>而并没有出现你说的那样，最终结果不确定。<br>我不知道我是否正确地理解楼主的意思？</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2752237,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2752237,&#39;Bury&#39;,this)">反对(0)</a></div><span id="comment_2752237_avatar" style="display:none;">http://pic.cnitblog.com/face/502903/20130310090056.png</span>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2767942" class="layer">#11楼</a><a name="2767942" id="comment_anchor_2767942"></a>
				 <span class="comment_date">2013-09-04 09:50</span> | <a id="a_comment_author_2767942" href="http://home.cnblogs.com/u/564375/" target="_blank">onther</a> <a href="http://msg.cnblogs.com/msg/send/onther" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2767942" class="blog_comment_body"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2752237" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,2752237);">@</a>holdoner<br>sleep(100)时间改短点，如（10）（1）<br>有时候机器快了也不行：）</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2767942,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2767942,&#39;Bury&#39;,this)">反对(0)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2827627" class="layer">#12楼</a><a name="2827627" id="comment_anchor_2827627"></a>
				 <span class="comment_date">2013-11-30 22:41</span> | <a id="a_comment_author_2827627" href="http://home.cnblogs.com/u/587515/" target="_blank">wyj@sunny</a> <a href="http://msg.cnblogs.com/msg/send/wyj%40sunny" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2827627" class="blog_comment_body">谢谢，感觉终于对synchronized明白多了</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2827627,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2827627,&#39;Bury&#39;,this)">反对(0)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2839800" class="layer">#13楼</a><a name="2839800" id="comment_anchor_2839800"></a>
				 <span class="comment_date">2013-12-18 13:58</span> | <a id="a_comment_author_2839800" href="http://home.cnblogs.com/u/401720/" target="_blank">菜鸟还没飞</a> <a href="http://msg.cnblogs.com/msg/send/%e8%8f%9c%e9%b8%9f%e8%bf%98%e6%b2%a1%e9%a3%9e" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2839800" class="blog_comment_body">机器好也不好</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2839800,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2839800,&#39;Bury&#39;,this)">反对(0)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2846382" class="layer">#14楼</a><a name="2846382" id="comment_anchor_2846382"></a>
				 <span class="comment_date">2013-12-28 14:09</span> | <a id="a_comment_author_2846382" href="http://www.cnblogs.com/carmanloneliness/" target="_blank">Andy Zhai</a> <a href="http://msg.cnblogs.com/msg/send/Andy+Zhai" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2846382" class="blog_comment_body"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2752237" title="查看所回复的评论" onclick="commentManager.renderComments(0,50,2752237);">@</a>holdoner<br>应该不会吧。不用1000个，10个线程就测出来了。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2846382,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2846382,&#39;Bury&#39;,this)">反对(0)</a></div><span id="comment_2846382_avatar" style="display:none;">http://pic.cnitblog.com/face/359415/20130310184331.png</span>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2887236" class="layer">#15楼</a><a name="2887236" id="comment_anchor_2887236"></a>
				 <span class="comment_date">2014-03-03 17:16</span> | <a id="a_comment_author_2887236" href="http://www.cnblogs.com/zmpandzmp/" target="_blank">zmpandzmp</a> <a href="http://msg.cnblogs.com/msg/send/zmpandzmp" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2887236" class="blog_comment_body">第一篇中的三和四什么区别啊?</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2887236,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2887236,&#39;Bury&#39;,this)">反对(0)</a></div><span id="comment_2887236_avatar" style="display:none;">http://pic.cnitblog.com/face/577797/20131029140222.png</span>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2919203" class="layer">#16楼</a><a name="2919203" id="comment_anchor_2919203"></a>
				 <span class="comment_date">2014-04-16 15:21</span> | <a id="a_comment_author_2919203" href="http://www.cnblogs.com/beyondchina/" target="_blank">beyondchina</a> <a href="http://msg.cnblogs.com/msg/send/beyondchina" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2919203" class="blog_comment_body">mark. 第一个程序运行结果都是一样，是我机器问题吗？还是程序有问题？至少运行10几次。<br>Finally, John's balance is:1000.0</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2919203,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2919203,&#39;Bury&#39;,this)">反对(0)</a></div><span id="comment_2919203_avatar" style="display:none;">http://pic.cnitblog.com/face/507671/20130326144957.png</span>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2996942" class="layer">#17楼</a><a name="2996942" id="comment_anchor_2996942"></a>
				 <span class="comment_date">2014-07-29 20:50</span> | <a id="a_comment_author_2996942" href="http://www.cnblogs.com/didawuhan/" target="_blank">didwang</a> <a href="http://msg.cnblogs.com/msg/send/didwang" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2996942" class="blog_comment_body">讲解synchronized内容的文章，我印象最深刻的是这篇文章，大家也可以去看看，与本文的角度不太一样的：<a href="http://www.strutshome.com/index.php/archives/495" target="_blank">http://www.strutshome.com/index.php/archives/495</a></div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2996942,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2996942,&#39;Bury&#39;,this)">反对(0)</a></div><span id="comment_2996942_avatar" style="display:none;">http://pic.cnitblog.com/face/u197061.jpg</span>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#2996946" class="layer">#18楼</a><a name="2996946" id="comment_anchor_2996946"></a>
				 <span class="comment_date">2014-07-29 20:52</span> | <a id="a_comment_author_2996946" href="http://www.cnblogs.com/didawuhan/" target="_blank">didwang</a> <a href="http://msg.cnblogs.com/msg/send/didwang" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_2996946" class="blog_comment_body">讲解synchronized内容的文章，我印象最深刻的是这篇文章，大家也可以去看看，与本文的角度不太一样的：<a href="http://www.strutshome.com/index.php/archives/495" target="_blank">synchronized深刻认识</a></div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(2996946,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(2996946,&#39;Bury&#39;,this)">反对(0)</a></div><span id="comment_2996946_avatar" style="display:none;">http://pic.cnitblog.com/face/u197061.jpg</span>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#3002157" class="layer">#19楼</a><a name="3002157" id="comment_anchor_3002157"></a>
				 <span class="comment_date">2014-08-06 22:51</span> | <a id="a_comment_author_3002157" href="http://www.cnblogs.com/send-mark/" target="_blank">易之名</a> <a href="http://msg.cnblogs.com/msg/send/%e6%98%93%e4%b9%8b%e5%90%8d" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_3002157" class="blog_comment_body">synchronized不能被继承吗？为什么经过测试是似乎是能被继承呢，你是否可以举个例子呢。</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3002157,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3002157,&#39;Bury&#39;,this)">反对(0)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#3002697" class="layer">#20楼</a><a name="3002697" id="comment_anchor_3002697"></a>
				 <span class="comment_date">2014-08-07 16:12</span> | <a id="a_comment_author_3002697" href="http://home.cnblogs.com/u/660818/" target="_blank">Mr_Sky</a> <a href="http://msg.cnblogs.com/msg/send/Mr_Sky" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_3002697" class="blog_comment_body">lz对同步的讲解很深刻，特别是那个房间的比喻特别好。我对这里有点不明白<br>"还用前面那个想连续用两个上锁房间的家伙打比方。怎样才能在用完一间以后，继续使用另一间呢。用同步代码块吧。。。。。" 。请问lz能用代码举个例子吗</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3002697,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3002697,&#39;Bury&#39;,this)">反对(0)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	
		<div class="feedbackItem">
			<div class="feedbackListSubtitle">
			<a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#3159213" class="layer">#21楼</a><a name="3159213" id="comment_anchor_3159213"></a><span id="comment-maxId" style="display:none;">3159213</span><span id="comment-maxDate" style="display:none;">2015/4/9 16:55:44</span>
				 <span class="comment_date">2015-04-09 16:55</span> | <a id="a_comment_author_3159213" href="http://home.cnblogs.com/u/343295/" target="_blank">灵印</a> <a href="http://msg.cnblogs.com/msg/send/%e7%81%b5%e5%8d%b0" title="发送站内短消息" class="sendMsg2This">&nbsp;</a><br>
				<div align="left"><div id="comment_body_3159213" class="blog_comment_body">在“使用synchronized”中，第一个例子，其中睡眠其实也有并发，导致这个睡眠函数就相当于一个yield函数似得，整个程序睡眠很短，尽管有1000个线程。具体解释，比如第1个thread睡眠了，第2个执行，也立马睡眠，第1,2个thread进行睡眠的间隔很短，其他类似，所以说1000个线程相当于同时睡眠似得，所以整个程序运行时间很短，没有睡眠多长时间，要是在sleep函数中加一个同步锁效果就不一样了。还有就是如果sleep一样，balance的输出一样的可能性比较大，最好改成Thread.sleep((long)(Math.random()*10));</div><div class="comment_vote"><a href="javascript:void(0);" class="comment_digg" onclick="return voteComment(3159213,&#39;Digg&#39;,this)">支持(0)</a><a href="javascript:void(0);" class="comment_bury" onclick="return voteComment(3159213,&#39;Bury&#39;,this)">反对(0)</a></div>&nbsp;&nbsp;<span class="comment_actions"></span></div>
			</div>
			
			
		</div>
	



<div id="comments_pager_bottom"></div></div><script type="text/javascript">var commentManager = new blogCommentManager();commentManager.renderComments(0);</script>
<div id="comment_form" class="commentform">
<a name="commentform"></a>
<div id="divCommentShow"></div>
<div id="comment_nav"><span id="span_refresh_tips"></span><a href="javascript:void(0);" id="lnk_RefreshComments" onclick="return RefreshCommentList();">刷新评论</a><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#" onclick="return RefreshPage();">刷新页面</a><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html#top">返回顶部</a></div>
<div id="comment_form_container"><div class="login_tips">注册用户登录后才能发表评论，请 <a rel="nofollow" href="javascript:void(0);" class="underline" onclick="return login(&#39;commentform&#39;);">登录</a> 或 <a rel="nofollow" href="javascript:void(0);" class="underline" onclick="return register();">注册</a>，<a href="http://www.cnblogs.com/">访问</a>网站首页。</div></div>
<div class="ad_text_commentbox" id="ad_text_under_commentbox"></div>
<div id="site_nav_under"><a href="http://www.ucancode.com/index.htm" target="_blank">【推荐】50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库</a><br><a href="http://www.rongcloud.cn/promotion" target="_blank">融云，免费为你的App加入IM功能——让你的App“聊”起来！！</a><br></div>
<div id="opt_under_post"></div>
<script type="text/javascript">
    var enableGoogleAd = canShowAdsense(); var googletag = googletag || {}; googletag.cmd = googletag.cmd || [];
    fixPostBodyFormat();
</script>
<div id="ad_under_post_holder">
<script type="text/javascript">
    var googletag = googletag || {};
    googletag.cmd = googletag.cmd || [];
    (function () {
        if (enableGoogleAd) {
            var gads = document.createElement('script');
            gads.async = true;
            gads.type = 'text/javascript';
            var useSSL = 'https:' == document.location.protocol;
            gads.src = (useSSL ? 'https:' : 'http:') + '//www.googletagservices.com/tag/js/gpt.js';
            var node = document.getElementsByTagName('script')[0];
            node.parentNode.insertBefore(gads, node);
        }
    })();
</script>
<script type="text/javascript">
    try {
        if (enableGoogleAd) {
            googletag.cmd.push(function () {
                googletag.defineSlot('/1090369/cnblogs_blogpost_C1_sitehome', [300, 250], 'div-gpt-ad-1346480159711-0').addService(googletag.pubads());
                googletag.defineSlot('/1090369/cnblogs_blogpost_C2', [468, 60], 'div-gpt-ad-1410860226396-0').addService(googletag.pubads());
                googletag.pubads().enableSingleRequest();
                googletag.enableServices();
            });
        };
    } catch (e) { }
</script>
<div id="google_ad_c1" class="c_ad_block">
    <div id="div-gpt-ad-1346480159711-0" style="width:300px; height:250px;">
    <script type="text/javascript">
        try {
            if (enableGoogleAd) {
                googletag.cmd.push(function () { googletag.display('div-gpt-ad-1346480159711-0'); });            
            } else {
                $('#div-gpt-ad-1346480159711-0').hide();
            }
    } catch (e) { }
    </script>
    <div id="google_ads_iframe_/1090369/cnblogs_blogpost_C1_sitehome_0__container__" style="border: 0pt none;"><iframe id="google_ads_iframe_/1090369/cnblogs_blogpost_C1_sitehome_0" name="google_ads_iframe_/1090369/cnblogs_blogpost_C1_sitehome_0" width="300" height="250" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" src="javascript:"<html><body style='background:transparent'></body></html>"" style="border: 0px; vertical-align: bottom;"></iframe></div><iframe id="google_ads_iframe_/1090369/cnblogs_blogpost_C1_sitehome_0__hidden__" name="google_ads_iframe_/1090369/cnblogs_blogpost_C1_sitehome_0__hidden__" width="0" height="0" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" src="javascript:"<html><body style='background:transparent'></body></html>"" style="border: 0px; vertical-align: bottom; visibility: hidden; display: none;"></iframe></div>
</div>
</div>
<div id="under_post_news"><div class="itnews c_ad_block"><b>最新IT新闻</b>:<br> ·  <a href="http://news.cnblogs.com/n/518911/" target="_blank">科学家欲钻探墨西哥陨石坑 寻小行星撞击证据</a><br> ·  <a href="http://news.cnblogs.com/n/518910/" target="_blank">联想启用新LOGO 弃用斜体设计</a><br> ·  <a href="http://news.cnblogs.com/n/518909/" target="_blank">乐淘创始人毕胜又创业了 这次他要做C2M</a><br> ·  <a href="http://news.cnblogs.com/n/518908/" target="_blank">谷歌翻译增设粤语 邀网民帮忙</a><br> ·  <a href="http://news.cnblogs.com/n/518907/" target="_blank">梁伟平：一度非常焦虑 卖掉安居客后转战房产O2O</a><br>» <a href="http://news.cnblogs.com/" title="IT新闻" target="_blank">更多新闻...</a></div></div>
<div id="google_ad_c2" class="c_ad_block">
<div id="div-gpt-ad-1410860226396-0" style="width:468px; height:60px;">
<script type="text/javascript">
try {
    if (enableGoogleAd) {
        googletag.cmd.push(function () { googletag.display('div-gpt-ad-1410860226396-0'); });
    } else {
        $('#div-gpt-ad-1346480159711-0').hide();
    }
} catch (e) { }
</script>
<div id="google_ads_iframe_/1090369/cnblogs_blogpost_C2_0__container__" style="border: 0pt none;"><iframe id="google_ads_iframe_/1090369/cnblogs_blogpost_C2_0" name="google_ads_iframe_/1090369/cnblogs_blogpost_C2_0" width="468" height="60" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" src="javascript:"<html><body style='background:transparent'></body></html>"" style="border: 0px; vertical-align: bottom;"></iframe></div></div>
</div>
<div id="under_post_kb"><div class="itnews c_ad_block" id="kb_block"><b>最新知识库文章</b>:<br><div id="kb_recent"> ·  <a href="http://kb.cnblogs.com/page/505877/" target="_blank">好团队不可能凭空出现，赢在Leader的可行规划</a><br> ·  <a href="http://kb.cnblogs.com/page/518772/" target="_blank">移动应用测试——打造完美应用的秘诀</a><br> ·  <a href="http://kb.cnblogs.com/page/137715/" target="_blank">什么是对象，为什么要面向对象，怎么才能面向对象？</a><br> ·  <a href="http://kb.cnblogs.com/page/208537/" target="_blank">驱动方法不能改变任何事情</a><br> ·  <a href="http://kb.cnblogs.com/page/196716/" target="_blank">推行TDD的思考</a><br></div>» <a href="http://kb.cnblogs.com/" target="_blank">更多知识库文章...</a></div></div>
<div id="HistoryToday" class="c_ad_block"></div>
<script type="text/javascript">
$(function () {
    loadNewsAndKb();
    loadBlogSignature();
    LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
    GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate);
    loadOptUnderPost();
    GetHistoryToday(cb_blogId, cb_blogApp, cb_entryCreatedDate);
    setTimeout(function () { incrementViewCount(cb_entryId); }, 200);
});
</script>
</div>

</div>
<div id="leftcontent">
	
		<div id="leftcontentcontainer">
			
<!--done-->
<div class="newsItem">
	<div id="blog-news"><div id="profile_block">昵称：<a href="http://home.cnblogs.com/u/devinzhang/">Devin Zhang</a><br>园龄：<a href="http://home.cnblogs.com/u/devinzhang/" title="入园时间：2011-01-23">4年2个月</a><br>粉丝：<a href="http://home.cnblogs.com/u/devinzhang/followers/">652</a><br>关注：<a href="http://home.cnblogs.com/u/devinzhang/followees/">0</a><div id="p_b_follow"><a href="javascript:void(0);" onclick="cnblogs.UserManager.FollowBlogger(&#39;65ff1fe1-c126-e011-ac81-842b2b196315&#39;)">+加关注</a></div></div></div><script type="text/javascript">loadBlogNews();</script>
</div>

			<div id="blog-calendar" style=""><table id="blogCalendar" class="Cal" cellspacing="0" cellpadding="0" title="日历">
	<tbody><tr><td colspan="7"><table class="CalTitle" cellspacing="0">
		<tbody><tr><td class="CalNextPrev"><a href="javascript:void(0);" onclick="loadBlogCalendar(&#39;2011/11/01&#39;);return false;">&lt;</a></td><td align="center">2011年12月</td><td class="CalNextPrev" align="right"><a href="javascript:void(0);" onclick="loadBlogCalendar(&#39;2012/01/01&#39;);return false;">&gt;</a></td></tr>
	</tbody></table></td></tr><tr><th class="CalDayHeader" align="center" abbr="日" scope="col">日</th><th class="CalDayHeader" align="center" abbr="一" scope="col">一</th><th class="CalDayHeader" align="center" abbr="二" scope="col">二</th><th class="CalDayHeader" align="center" abbr="三" scope="col">三</th><th class="CalDayHeader" align="center" abbr="四" scope="col">四</th><th class="CalDayHeader" align="center" abbr="五" scope="col">五</th><th class="CalDayHeader" align="center" abbr="六" scope="col">六</th></tr><tr><td class="CalOtherMonthDay" align="center">27</td><td class="CalOtherMonthDay" align="center">28</td><td class="CalOtherMonthDay" align="center">29</td><td class="CalOtherMonthDay" align="center">30</td><td align="center">1</td><td align="center">2</td><td class="CalWeekendDay" align="center">3</td></tr><tr><td class="CalWeekendDay" align="center">4</td><td align="center">5</td><td align="center">6</td><td align="center">7</td><td align="center">8</td><td align="center">9</td><td class="CalWeekendDay" align="center">10</td></tr><tr><td class="CalWeekendDay" align="center">11</td><td align="center">12</td><td align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/13.html"><u>13</u></a></td><td align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/14.html"><u>14</u></a></td><td align="center">15</td><td align="center">16</td><td class="CalWeekendDay" align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/17.html"><u>17</u></a></td></tr><tr><td class="CalWeekendDay" align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/18.html"><u>18</u></a></td><td align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/19.html"><u>19</u></a></td><td align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/20.html"><u>20</u></a></td><td align="center">21</td><td align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/22.html"><u>22</u></a></td><td align="center">23</td><td class="CalWeekendDay" align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/24.html"><u>24</u></a></td></tr><tr><td class="CalWeekendDay" align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/25.html"><u>25</u></a></td><td align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/26.html"><u>26</u></a></td><td align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/27.html"><u>27</u></a></td><td align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/28.html"><u>28</u></a></td><td align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/29.html"><u>29</u></a></td><td align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/30.html"><u>30</u></a></td><td class="CalWeekendDay" align="center"><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/31.html"><u>31</u></a></td></tr><tr><td class="CalOtherMonthDay" align="center">1</td><td class="CalOtherMonthDay" align="center">2</td><td class="CalOtherMonthDay" align="center">3</td><td class="CalOtherMonthDay" align="center">4</td><td class="CalOtherMonthDay" align="center">5</td><td class="CalOtherMonthDay" align="center">6</td><td class="CalOtherMonthDay" align="center">7</td></tr>
</tbody></table></div><script type="text/javascript">loadBlogDefaultCalendar();</script><br>
			<div id="blog-sidecolumn">
<div class="mySearch">
<h3 class="catListTitle">搜索</h3>
<div id="widget_my_zzk" class="div_my_zzk"><input type="text" id="q" onkeydown="return zzk_go_enter(event);" class="input_my_zzk">&nbsp;<input onclick="zzk_go()" type="button" value="找找看" id="btnZzk" class="btn_my_zzk"></div>

</div>


		<h3 class="catListTitle">随笔分类<span style="font-size:11px;font-weight:normal">(117)</span></h3>
		
				<ul class="catList">
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_0" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349645.html">Android之Activity(8)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_1" class="listitem" href="http://www.cnblogs.com/devinzhang/category/350267.html">Android之Adapter(1)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_2" class="listitem" href="http://www.cnblogs.com/devinzhang/category/350233.html">Android之ContentProvider(1)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_3" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349635.html">Android之Handler(4)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_4" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349641.html">Android之JSON(2)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_5" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349634.html">Android之Service(4)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_6" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349639.html">Android之SharedPreferences(2)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_7" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349637.html">Android之SQLite(2)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_8" class="listitem" href="http://www.cnblogs.com/devinzhang/category/350251.html">Android之SurfaceView(5)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_9" class="listitem" href="http://www.cnblogs.com/devinzhang/category/350586.html">Android之Widget(1)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_10" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349640.html">Android之XML(1)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_11" class="listitem" href="http://www.cnblogs.com/devinzhang/category/350975.html">Android之菜单(1)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_12" class="listitem" href="http://www.cnblogs.com/devinzhang/category/350662.html">Android之单元测试(1)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_13" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349644.html">Android之调试开发工具(4)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_14" class="listitem" href="http://www.cnblogs.com/devinzhang/category/357974.html">Android之多点触控(2)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_15" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349638.html">Android之环境配置(4)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_16" class="listitem" href="http://www.cnblogs.com/devinzhang/category/357975.html">Android之基础知识(2)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_17" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349908.html">Android之界面布局(6)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_18" class="listitem" href="http://www.cnblogs.com/devinzhang/category/357973.html">Android之图形图像(1)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_19" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349642.html">Android之网络编程(10)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_20" class="listitem" href="http://www.cnblogs.com/devinzhang/category/350164.html">Android之文件操作(1)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_21" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349643.html">Android之优化技术(3)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_22" class="listitem" href="http://www.cnblogs.com/devinzhang/category/359065.html">Android之游戏开发(4)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_23" class="listitem" href="http://www.cnblogs.com/devinzhang/category/342339.html">Java基础知识(17)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_24" class="listitem" href="http://www.cnblogs.com/devinzhang/category/358002.html">Java之安全通信(2)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_25" class="listitem" href="http://www.cnblogs.com/devinzhang/category/350523.html">Java之集合类(4)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_26" class="listitem" href="http://www.cnblogs.com/devinzhang/category/350551.html">Java之数据结构(3)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_27" class="listitem" href="http://www.cnblogs.com/devinzhang/category/349646.html">Java之线程池和对象池(3)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_28" class="listitem" href="http://www.cnblogs.com/devinzhang/category/342301.html">设计模式(17)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_0_Link_29" class="listitem" href="http://www.cnblogs.com/devinzhang/category/375934.html">杂谈(1)</a></li>
			
				</ul>
			
	
		<h3 class="catListTitle">随笔档案<span style="font-size:11px;font-weight:normal">(120)</span></h3>
		
				<ul class="catList">
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_0" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2014/07.html">2014年7月 (2)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_1" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2013/08.html">2013年8月 (1)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_2" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2012/10.html">2012年10月 (1)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_3" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2012/09.html">2012年9月 (2)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_4" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2012/08.html">2012年8月 (2)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_5" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2012/07.html">2012年7月 (3)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_6" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2012/06.html">2012年6月 (1)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_7" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2012/05.html">2012年5月 (1)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_8" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2012/04.html">2012年4月 (9)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_9" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2012/03.html">2012年3月 (5)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_10" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2012/02.html">2012年2月 (24)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_11" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2012/01.html">2012年1月 (46)</a></li>
			
				<li class="catListItem"> <a id="CatList_LinkList_1_Link_12" class="listitem" href="http://www.cnblogs.com/devinzhang/archive/2011/12.html">2011年12月 (23)</a></li>
			
				</ul>
			
	

<h3>积分与排名</h3>
<ul>
	<li>
		积分 -
		255016
	</li><li>
		排名 -
		422
	</li>
</ul>
<div id="topview_posts_wrap">
<h3 class="catListTitle">阅读排行榜</h3>
<div class="RecentComment" id="TopViewPosts"> 
	<div id="TopViewPostsBlock"><ul><li><a href="http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html">1. android AsyncTask介绍(125663)</a></li><li><a href="./Java synchronized详解 - Devin Zhang - 博客园_files/Java synchronized详解 - Devin Zhang - 博客园.html">2. Java synchronized详解(102463)</a></li><li><a href="http://www.cnblogs.com/devinzhang/archive/2011/12/30/2306980.html">3. Android之Handler用法总结(97860)</a></li><li><a href="http://www.cnblogs.com/devinzhang/archive/2012/02/29/2373729.html">4. Android之NDK开发(85085)</a></li><li><a href="http://www.cnblogs.com/devinzhang/archive/2012/01/20/2328334.html">5. Android之Adapter用法总结(61028)</a></li></ul></div>
</div>
</div><div id="topfeedback_posts_wrap">
<h3 class="catListTitle">评论排行榜</h3>
<div class="RecentComment" id="TopCommentsPosts">
	<div id="TopFeedbackPostsBlock"><ul><li><a href="./Java synchronized详解 - Devin Zhang - 博客园_files/Java synchronized详解 - Devin Zhang - 博客园.html">1. Java synchronized详解(21)</a></li><li><a href="http://www.cnblogs.com/devinzhang/archive/2012/01/20/2328334.html">2. Android之Adapter用法总结(18)</a></li><li><a href="http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html">3. android AsyncTask介绍(17)</a></li><li><a href="http://www.cnblogs.com/devinzhang/archive/2012/01/20/2327863.html">4. Android之ContentProvider总结(11)</a></li><li><a href="http://www.cnblogs.com/devinzhang/archive/2012/07/02/2573554.html">5. Listview中显示不同的视图布局(10)</a></li></ul></div>
</div></div></div><script type="text/javascript">loadBlogSideColumn();</script><script async="" type="text/javascript" src="./Java synchronized详解 - Devin Zhang - 博客园_files/check_359604.js"></script><iframe src="./Java synchronized详解 - Devin Zhang - 博客园_files/container.html" style="visibility: hidden; display: none;"></iframe></div>
	
</div>

<!--done-->
<div class="footer">
	Powered by: <a href="http://www.cnblogs.com/">博客园</a>	模板提供：<a href="http://blog.hjenglish.com/">沪江博客</a>
	Copyright ©2015 Devin Zhang
</div>





<iframe id="google_osd_static_frame_8281447724439" name="google_osd_static_frame" style="display: none; width: 0px; height: 0px;"></iframe></body></html>